from connectMysql import MySQLTest
import random
import hashlib


class UserManage:

    def __init__(self):
        self.mt = MySQLTest()

    def main(self):
        print("--------欢迎来到用户管理系统---------")
        opt = input("请选择登录（1） 或者 注册（2）：")
        if opt == "1":
            # 登录操作
            while True:
                account = input("请输入账号：")
                password1 = input("请输入密码：")
                password2 = self.md5(password1)
                islogin = self.login(account, password2)
                if not islogin:
                    print("------- 输入的账号或者密码有误，请重新输入 -------")
                else:
                    # 登录成功
                    num = input("修改个人信息(输入1) 或者 注销用户(输入2) 或者 "
                                "查询个人信息(输入3) 或者 查询所有信息(输入4)：")
                    if num == "1":
                        self.modify(account)
                    elif num == "2":
                        self.cancel(account)
                    elif num == "3":
                        self.select_one(account)
                    elif num == "4":
                        self.select_all(account)
                    break
        elif opt == "2":
            # 注册操作
            while True:
                account = input("请输入注册账号：")
                isreg = self.register(account)
                if isreg:
                    print("----- 账户注册成功 -----")
                    break
                else:
                    print("----- 账户已经存在，请输入新的账户 -----")
        else:
            print("---- 输出有误，请输入正确的选项 ----")

    # 登录 如果登录成功就返回True 否则返回false 0.2586
    def login(self, acc, pwd):
        sql = f'select account from user where account="{acc}" and password="{pwd}";'
        res = self.mt.fetchone(sql)
        if res:
            while True:
                # 说明账号密码对的  然后随机一个验证码
                code = str(int(random.random() * 10000))
                u_code = input(f"请输入验证码（{code}）：")
                # 判断验证码输入是否正确
                if code == u_code:
                    print("--------- 登录成功 ----------")
                    return True
                else:
                    print("--------- 验证码有误，请重新输入验证码 ----------")
        return False

    def modify(self, account):
        pwd1 = input("请输入新密码:")
        pwd2 = input("确认新密码:")
        if pwd1 == pwd2:
            nk = input("请输入新昵称：")
            sql = f'update user set password="{pwd1}",nickname="{nk}" where account="{account}";'
            self.mt.update(sql)
        else:
            print("------ 两次输入的密码不一致 ------")
            self.modify(account)

    def cancel(self, account):
        # 把user表中的账户信息导入到user_old
        sql = f'insert into user_old (id, account, password, nickname) ' \
              f'select id, account, password, nickname from user where account="{account}";'
        # 从一个数据库导入到另外一个数据库
        res1 = self.mt.db1_import_db2(sql)
        sql = f'delete from user where account="{account}";'
        res2 = self.mt.delete(sql)
        if res1 and res2:
            print("----- 用户注销成功 -----")

    def md5(self, str1):
        # MD5加密
        # 生成一个加密对象
        m = hashlib.md5()
        # 对123字符加密  加密的数据类型时bytes类型
        # 字符串转换为bytes类型
        str_b = str1.encode("utf-8")
        m.update(str_b)
        # hexdigest 获取16进制的加密之后的字符串
        res = m.hexdigest()
        # print(type(res), res)
        # 只需要加密后的前十位  字符串
        return res[:10]

    def register(self, account):
        sql = f'select account from user where account="{account}"'
        res = self.mt.fetchone(sql)
        if res:
            # 已经存在
            return False
        else:
            # 用户不存在  可以输入密码
            pwd1 = input("请输入密码：")
            pwd2 = self.md5(pwd1)
            nickname = input("请输入昵称：")
            if account == "root":
                sql = f'insert into user (account,password,nickname,power) values ' \
                      f'("{account}", "{pwd2}", "{nickname}", 1);'
            else:
                sql = f'insert into user (account,password,nickname) values ' \
                      f'("{account}", "{pwd2}", "{nickname}");'
            return self.mt.insert(sql)

    def select_one(self, account):
        pwd = input("查询时请再次输入密码：")
        pwd2 = self.md5(pwd)
        sql = f'select * from user where account="{account}" and password="{pwd2}";'
        self.mt.query(sql)

    def select_all(self, account):
        if account == "root":
            sql = 'select * from user;'
            self.mt.query(sql)
        else:
            print("----- 用户权限不够 -----")


if __name__ == '__main__':
    um = UserManage()
    um.main()
